OptionHouse/Widgets
This page is dedicated to example widgets for OptionHouse. There will also be code for easily making the code work with your options. This code block provides RegisterCheckOption and RegisterSliderOption which take a get, set, and help function. The get function just returns what the value should be for the widget (checked or SetValue status), set is called whenever the value of the widget changes. Finally the option help function is called when the widget is moused-over. The mouse-over action is actually delayed to behave more like other UI elements outside of WoW. The code doesn't do any error checking so as such it is only provided as is. It has been pointed out that the behavior for the tooltips when using the help function is not the default in wow. As such, you can just set the tooltipText and not provide a help function to Register*Option, this will force the default behavior of the widgets os defined in the CreateCheckButton and CreateSlider. local RegisterCheckOption, RegisterSliderOption do -- put everything in a do..end block to make it private -- this could be any frame you want it to be you don't need the OnUpdate function for -- and will be shown with your options. local visFrame = CreateFrame("Frame") local helps = {} -- for storing help stuff -- timeout is how long before we forget we were showing, timeToShow is how -- long before we actually show, these values seem fairly sane local timeOut, timeToShow = 2.0, 0.5 local totalElapsed, showTooltip, state = 0 local onUpdate = function(frame, elapsed) totalElapsed = totalElapsed + elapsed if showTooltip then if totalElapsed > timeToShow and state 1 then -- actually show stuff helpsshowTooltip(showTooltip) state = 2 totalElapsed = 0 end -- we need to reshow the tooltip quickly if totalElapsed < timeOut and state 2 then helpsshowTooltip(showTooltip) state = 2 totalElapsed = 0 end else if totalElapsed > timeOut then -- reset our timeout state = 1 visFrame:SetScript("OnUpdate", nil) end end end local registerHelp = function(frame, helpFunc) helpsframe = helpFunc end local showHelp = function(frame) showTooltip = frame totalElapsed = 0 if state ~= 2 then state = 1 end if visFrame then visFrame:SetScript("OnUpdate", onUpdate) end end local hideHelp = function() totalElapsed = 0 showTooltip = nil state = 2 GameTooltip:Hide() end RegisterCheckOption = function(frame, get, set, help) frame:SetScript("OnClick", function(self) set(self:GetChecked() or false) end ) frame:SetScript("OnShow", function(self) self:SetChecked(get()) end ) if help then registerHelp(frame, help) frame:SetScript("OnEnter", showHelp) frame:SetScript("OnLeave", hideHelp) end end RegisterSliderOption = function(frame, get, set, help) frame:SetScript("OnValueChanged", function(self) set(self:GetValue()) end ) frame:SetScript("OnShow", function(self) self:SetValue(get()) end ) if help then registerHelp(frame, help) frame:SetScript("OnEnter", showHelp) frame:SetScript("OnLeave", hideHelp) end end end Widgets CheckBox This checkbox is a nameless replica of the OptionsCheckBoxTemplate as seen here. local function CreateCheckButton(par) local f = CreateFrame('CheckButton', nil, par) f:SetHeight(32) f:SetWidth(32) f.text = f:CreateFontString(nil, nil, "GameFontNormalSmall") f.text:SetPoint("LEFT", f, "RIGHT", -2, 0) local t = f:CreateTexture() f:SetNormalTexture("Interface\\Buttons\\UI-CheckBox-Up") f:SetPushedTexture("Interface\\Buttons\\UI-CheckBox-Down") f:SetHighlightTexture("Interface\\Buttons\\UI-CheckBox-Highlight") f:GetHighlightTexture():SetBlendMode("ADD") f:SetCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check") f:SetDisabledCheckedTexture("Interface\\Buttons\\UI-CheckBox-Check-Disable") f:SetHitRectInsets(0, -100, 0, 0) f:SetScript("OnEnter", function(self) if self.tooltipText then GameTooltip:SetOwner(this, "ANCHOR_RIGHT") GameTooltip:SetText(this.tooltipText, nil, nil, nil, nil, 1) end if self.tooltipRequirement then GameTooltip:AddLine(this.tooltipRequirement, "", 1.0, 1.0, 1.0) GameTooltip:Show() end end ) f:SetScript("OnLeave", function(self) GameTooltip:Hide() end) return f end Slider This function returns a frame that is a nameless replica of the OptionsSliderTemplate provided by Blizzard. local bg = { bgFile = "Interface\\Buttons\\UI-SliderBar-Background", edgeFile = "Interface\\Buttons\\UI-SliderBar-Border", tile = true, tileSize = 8, edgeSize = 8, insets = { left = 3, right = 3, top = 6, bottom = 6 } } local function CreateSlider(par) local f = CreateFrame('Slider', nil, par) f:SetBackdrop(bg) f:SetWidth(128) f:SetHeight(17) f:SetOrientation("HORIZONTAL") f:SetHitRectInsets(0, 0, -10, -10) local fs = f:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall") fs:SetPoint('BOTTOM', f, "TOP", 0, 2) f.text = fs fs = f:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") fs:SetPoint("TOPLEFT", f, "BOTTOMLEFT", 2, 3) f.low = fs fs = f:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall") fs:SetPoint("TOPRIGHT", f, "BOTTOMRIGHT", -2, 3) f.high = fs local text = f:CreateTexture() text:SetTexture("Interface\\Buttons\\UI-SliderBar-Button-Horizontal") text:SetHeight(32) text:SetWidth(32) f:SetThumbTexture(text) f.thumb = text f:SetScript("OnEnter", function(self) if self.tooltipText then GameTooltip:SetOwner(this, "ANCHOR_RIGHT") GameTooltip:SetText(this.tooltipText, nil, nil, nil, nil, 1) end if self.tooltipRequirement then GameTooltip:AddLine(this.tooltipRequirement, "", 1.0, 1.0, 1.0) GameTooltip:Show() end end ) f:SetScript("OnLeave", function(self) GameTooltip:Hide() end) return f end Category:Dongle